package com.tedu.api.map.socket;
import org.junit.Test;
import java.io.*;
import java.io.File;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

/**
 * Lambda表达式--> ()->{} 【接口/抽象类--匿名内部类】
 *                       【集合遍历--匿名内部类】
 * Collection-->List：存重复元素并且有序【保证数据结构一致】
 *              Set：无序并且不重复【保证数据结构一致】
 *              Queue：队列结合业务
 * Map----------HashMap：键值对存储
 */
public class LambdaDemo {
    @Test
    public void testList(){
        //List集合
        List<String> list=new ArrayList<>();
        list.add("白洋淀");
        list.add("正定古城");
        list.add("河头老街");
        list.add("白石山");
        //集合三种遍历方式：普通for、增强for、支持forEach方法
        for (String str: list){
            System.out.println("增强for："+str);
        }
        //支持forEach方法:遍历集合元素 Consumer针对List、set、Queue集合提供接口：功能获取list集合元素
        //Consumer接口针对List集合提供接口：功能获取list集合元素
        list.forEach(new Consumer<String>(){
            public void accept(String s) {
                System.out.println("consumer接口遍历方案："+s);
            }
        });
        //支持forEach方法“遍历集合元素【Consumer 匿名内部类】
        //编写Lambda表达式写法
        list.forEach((s)->System.out.println("Lambda遍历方案："+s));
    }
    @Test
    public void testMap() {
        //创建Map集合
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "唐山");
        map.put(2, "石家庄");
        map.put(3, "秦皇岛");
        map.put(4, "邢台");
        //遍历集合：普通for、增强for、forEach(BiConSummer接口--匿名内部类)
        //键值对-->一组Entry对象
        //BiConSummer接口--获取每组Entry对象
        map.forEach(new BiConsumer<Integer, String>() {
            public void accept(Integer integer, String s) {
                System.out.println("键："+integer+"值："+s);
            }
        });
        //使用Lambda表达式
        map.forEach((i,s)->System.out.println
                ("forEach遍历键："+i+" "+"forEach遍历值："+s));
    }
    /**
     * 作业：1.使用Lambda表达式完成 Thread线程创建
     *      2.使用Lambda表达式完成 Runnable线程创建
     *      3.IO流--File类:listFile(FileFilter接口)【5行代码】
     *      目标:【io包下 FilterAPI类】实现使用Lambda表达式完成
     *      4.IO流--File类:listFile(FileFilter接口)【2行代码】
     *      目标:【io包下FilterAPI类】实现使用Lambda表达式完成
     *      5.集合:改成lambda写法
     *      目标：【list包下ListAPI类下单元测试：testComparator()】
     *      lambdaDemo类下--完成作业
     *     @LambdaHomeWork1
     *     @LambdaHomeWork2 ...
     */
    @Test
    public void testLambdaHomeWork1(){
        Thread t1=new Thread(() -> {for (int i=0;i<1000;i++){
                System.out.println("嘻嘻嘻");
            }});
        t1.start();
    //使用lambda表达式完成 Thread线程创建
        //Thread类Java定义线程类--具备启动start---
        //Thread类封装Runnable类--线程run运行
    }
    @Test
    public void testLambdaHomeWork2() {
        Runnable mr1= () -> {for (int i=0;i<1000;i++){
            System.out.println("时间不等人，但是我等你");
        }};
        //2.创建Thread线程类---start()
        Thread t2=new Thread(mr1);
        //3.启动线程
        t2.start();
    }
    @Test
    public void testLambdaHomeWork4() {
        for(File f:new File("."+File.separator+"API").listFiles((pathname) ->{return pathname.getName().startsWith("b");})){
            System.out.println("遍历后进行过滤完成后的结果："+f)
            ;}
    }
    @Test
    public void testLambdaHomeWork3(){
        File file=new File("."+File.separator+"API");
        FileFilter FF= pathname -> pathname.getName().startsWith("s");
        File[] subs=file.listFiles(FF);
        //3.打印子项下所有名字
        for(int i=0;i<subs.length;i++){//i下标，从0开始
            System.out.println("查找到的："+subs[i]);
        }
    }
    @Test
    public void testLambdaHomeWork5(){
        List<String> list=new ArrayList<>();
        list.add("我上早八！");
        list.add("我吃柠檬");
        list.add("我去年买了个表");
        Collections.sort(list,Comparator.comparingInt(String::length));
        System.out.println("排序后的集合" + list);
    }
}